#include <stdio.h>

// 定义结构体
struct Student {
    int age;
    short score;
} s1, s2; // 定义结构体直接声明变量直接使用

// 结构体定义别名
typedef struct {
    char *name;
} Person;

// 结构体计算大小：字节对其
/**如果没有指定对其方式使用自然对其
 * 规则一：某一个变量保存的内存地址的开始位置，需要相对于结构体开始位置的偏移是这个变量字节数的整数倍数
 * 规则二：结构体所占字节数要是最长字节的整数倍
*/

/**可以指定对其方式
 *  指定按照两个字节对其，传入的参数必须是2的指数，可以节省空间，字节对其可以提升效率，不合理的对其方式可能降低效率
 *  此时s2由原来占用12字节到现在8个字节
 */
#pragma pack(2)
struct S1 {
// 占8个字节
    short i;
    short j;
    int k;
};
struct S2 {
// 占12个字节
    short i;
    int j;
    short k;
};

int main16() {

    // 在C++可以省略struct
    struct Student stu;

    s1.age = 10;
    s1.score = 1;
    printf("s1 size=%d\n", sizeof(S1));
    printf("s2 size=%d\n", sizeof(S2));
    struct S2 s2;
    /**
     * i=0x62fe0c,j=0x62fe10,k=0x62fe14
     * 规则一：i是short占用2个字节，j是int占4个字节，2不是4的整数倍，所以需要根据前面的地址+4，而short与int直接的两个字节就是空闲
     * 规则二：此时占10个字节不满足int的整数倍所以向上到12
     */
    printf("s2 memory start i=%#x,j=%#x,k=%#x", &s2.i, &s2.j, &s2.k);
    return 0;
}